package com.zdp.leetcodeMiddle;


import java.util.ArrayList;
import java.util.List;

/*
* 题目描述：
* 找出所有相加之和为 n 的 k 个数的组合。组合中只允许含有 1 - 9 的正整数，并且每种组合中不存在重复的数字。
说明：
所有数字都是正整数。
解集不能包含重复的组合。 
示例 1:

输入: k = 3, n = 7
输出: [[1,2,4]]
示例 2:

输入: k = 3, n = 9
输出: [[1,2,6], [1,3,5], [2,3,4]]

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/combination-sum-iii
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
* */
public class 组合总和II_216 {

    private List<List<Integer>> result = new ArrayList<>();
    public List<List<Integer>> combinationSum3(int k, int n) {
        f(k,n,new ArrayList<Integer>(),1,0,1);
        return result;
    }

    /*
    * 保证不重复： 每次递归 开始的数字都是之前的下一个
    * */
    public void f(int k,int n,List<Integer> temp,int count,int sum,int index){
        if(count > k){
            return ;
        }
        for(int i =index;i<=9;i++){
            if( sum + i >n){
                return ;
            }
            temp.add(i);
            if( sum + i == n && count == k){
                result.add(new ArrayList<>(temp));
                temp.remove(temp.size()-1);
                return ;
            }else {
                f(k,n,temp,count+1,sum+i,i+1);
                temp.remove(temp.size() - 1);
            }
        }
        return ;
    }
}
